package gandalf.controller;

import gandalf.PersistenceManager;
import gandalf.model.Dogodek;
import gandalf.model.Vstopnica;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Query;

public class DogodekDao {

    public EntityManager getEntityManager() {
        return PersistenceManager.createEntityManager();
    }

    public List<Dogodek> all(boolean admin) {
        List<Dogodek> dogodki = new ArrayList<Dogodek>();
        EntityManager em = null;
        try {
            em = getEntityManager();
            Query q = null;
            if (admin) {
                // ce smo prijavljeni kot admin, pokazemo vse dogodke
                q = em.createQuery("select object(d) from Dogodek as d ORDER BY d.datum ASC");
            } else {
                // dobimo samo aktualne dogodke, ki so objavljeni
                Date zdaj = new Date();
                q = em.createQuery("select object(d) from Dogodek as d WHERE d.objavljen = ? AND d.datum > ? ORDER BY d.datum ASC");
                q.setParameter(1, true);
                q.setParameter(2, zdaj);
            }
            dogodki = q.getResultList();
        } catch (Exception e) {
            e.printStackTrace();


        } finally {
            if (em != null) {
                em.close();


            }
        }

        return dogodki;


    }

    public List<String> getKategorije(List<Dogodek> dogodki) {
        List<String> kategorije = new ArrayList<String>();



        for (Dogodek d : dogodki) {
            if (kategorije.contains(d.getKategorija())) {
                continue;


            }

            kategorije.add(d.getKategorija());


        }

        return kategorije;


    }

    public Long create(Dogodek dogodek) {

        if (dogodek.getVstopnice() == null) {
            dogodek.setVstopnice(new ArrayList<Vstopnica>());


        }

        EntityManager em = null;


        try {
            em = getEntityManager();
            em.getTransaction().begin();

            /*for (Vstopnica vstopnica : dogodek.getVstopnice()) {

            vstopnica.setDogodek(dogodek);
            em.persist(vstopnica);
            }*/

            em.persist(dogodek);

            List<Vstopnica> vstopnice = new ArrayList<Vstopnica>();



            em.getTransaction().commit();


        } catch (Exception e) {
            e.printStackTrace();


        } finally {
            if (em != null) {
                em.close();


            }
            return dogodek.getId();


        }
    }

    public void edit(Dogodek updatanDogodek) {
        EntityManager em = null;


        try {
            em = getEntityManager();
            em.getTransaction().begin();
            

            Dogodek trenutniDogodek = em.find(
                    Dogodek.class, updatanDogodek.getId());
           

            List<Vstopnica> trenutneVstopnice = trenutniDogodek.getVstopnice();
         
            List<Vstopnica> noveVstopnice = new ArrayList<Vstopnica>();
            if (updatanDogodek.getVstopnice() != null) {
                noveVstopnice = updatanDogodek.getVstopnice();

            }

            List<Vstopnica> dodaneVstopnice = new ArrayList<Vstopnica>();
        

            // dodamo nove vstopnice

            if (!noveVstopnice.isEmpty()) {

                for (Vstopnica novaVstopnica : noveVstopnice) {
                    novaVstopnica = em.getReference(novaVstopnica.getClass(), novaVstopnica.getId());
                   
                    dodaneVstopnice.add(novaVstopnica);
                  
                }
            }
           
            noveVstopnice = dodaneVstopnice;
           

            updatanDogodek.setVstopnice(noveVstopnice);
         
            updatanDogodek = em.merge(updatanDogodek);
           
            // gremo skozi trenutne vstopnice in zbrišemo relacijo na dogodek, če jih ni v seznamu novih vstopnic




            if (!trenutneVstopnice.isEmpty()) {
                for (Vstopnica trenutnaVstopnica : trenutneVstopnice) {
                    if (!noveVstopnice.contains(trenutnaVstopnica)) {
                        trenutnaVstopnica.setDogodek(null);
                        trenutnaVstopnica = em.merge(trenutnaVstopnica);
                    }
                }
            }

            em.getTransaction().commit();

        } finally {
            if (em != null) {
                em.close();


            }
        }
    }

    public void destroy(Long id) {
        EntityManager em = null;


        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Dogodek dogodek;

            dogodek = em.getReference(
                    Dogodek.class, id);
            dogodek.getId();

            List<Vstopnica> vstopnice = dogodek.getVstopnice();





            for (Vstopnica vstopnica : vstopnice) {
                vstopnica.setDogodek(null);
                vstopnica = em.merge(vstopnica);
            }

            em.remove(dogodek);

            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();


            }
        }
    }

    public void destroyVstopnice(Long id) {
        EntityManager em = null;


        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Dogodek dogodek;

            dogodek = em.getReference(
                    Dogodek.class, id);
            dogodek.getId();

            List<Vstopnica> vstopnice = dogodek.getVstopnice();

            for (Vstopnica vstopnica : vstopnice) {
                em.remove(vstopnica);
            }

            

            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();


            }
        }
    }

    public Dogodek findDogodek(Long id) {
        EntityManager em = getEntityManager();





        try {
            return em.find(Dogodek.class, id);
        } finally {
            em.close();

        }
    }
}
